#include <iostream>
#include <cmath>
//#include "TFloat.h"

#include "Recta.h"
using namespace std;

/* pruebitas para el punto
	Punto p(3.0,2.0,3.0);
	//p.set(3.2,2.1,3.2);
	Punto q(1.0,1.0,0.0);
	p.Imprimir();
	p.set(3.2,2.1,3.2);
	p.Imprimir();
	cout<< p.get_x()<<endl;
	cout<< p.get_y()<<endl;
	cout<< p.get_z()<<endl;
	 Punto r= p.Sumar(q);
	r.Imprimir();
	Punto p2= q.Multiplicar(2.0);
	p2.Imprimir();
	
	// pruebas para recta
	
	Recta rect(q,p2);
	rect.Imprimir();
	Punto result = rect.Evaluar(0.5);
	result.Imprimir();*/

//calcula distancia entre dos puntos
double distancia(Punto a, Punto b){

    double x1=a.get_x();
    double x2=b.get_x();
    
    double y1= a.get_y();
    double y2= b.get_y();
    
    double z1= a.get_z();
    double z2= b.get_z();

    return sqrt(pow((x1-x2),2)+pow((y1-y2),2)+pow((z1-z2),2));

}

double calcularProximidad( Recta trayectoria, int cantPiedras, Punto piedras[], double tolerancia, double instante){
double acum =0;
	for(int i = 0; i<cantPiedras;i++){
		Punto valorEvaluarEnInstante = trayectoria.Evaluar(instante); 
		double dist = distancia(valorEvaluarEnInstante, piedras[i]);
		acum = acum + (1/dist);
	}
	acum = acum - tolerancia;
	return acum;
}

int signo(double d){
	if (d<0){
		return 1;
	}else{
		return -1;
	}
}
	

bool biseccion( Recta trayectoria, int cantPiedras, Punto a[], double tolerancia, double init, double fin, double tolIntervalo ){

double longIntervalo = fin -init;

if(longIntervalo <	tolIntervalo){
	cout<<"superman  puede atravesar la ciudad"<<endl;
	return true;
}

double prox1=calcularProximidad(trayectoria,cantPiedras,a,tolerancia,init);
double prox2=calcularProximidad(trayectoria,cantPiedras,a,tolerancia,fin);
//int sg = signo(calcularProximidad(trayectoria,cantPiedras,a,tolerancia,init)) * signo(calcularProximidad(trayectoria,cantPiedras,a,tolerancia,fin));

if((prox1>0) || (prox2>0)){
	cout<<"superman no puede atravesar la ciudad"<<endl;
		return false;
	}else{
		double medio = init + ((fin-init)/2);
		return( biseccion(trayectoria,cantPiedras,a,tolerancia, init, medio,tolIntervalo )&& biseccion(trayectoria,cantPiedras,a,tolerancia, medio, fin,tolIntervalo )  );
			
	}

}

int main()
{
	
	int cantPiedras;
	cout<< "ingrese la cantidad de piedras"<<endl;
	cin>> cantPiedras;
	Punto piedras[cantPiedras];
	
	for(int i=0; i<cantPiedras; i++){
      double x, y, z;
		cout<< "ingrese las coordenadas de las piedras"<<endl;
      cin >> x >> y >> z;
      Punto piedra(x,y,z);
      piedras[i]=piedra;
    }
	double tol;
	cout<< "ingrese el grado de proximidad tolerado"<<endl;
	cin >> tol;		
	/*verifica que se agregaron todas las piedras
	for(int j=0; j < cantPiedras;j++){
		piedras[j].Imprimir();
	}*/
	Punto p(2,0,2);
	Punto q(1,0,1);
	Recta t(p, q);
	
	//double proximidad = calcularProximidad( t, cantPiedras, piedras, tol, 0.5);
	//cout<< proximidad<<endl;
	biseccion(t,cantPiedras,piedras,tol,0,1,0.0001);
//biseccion( Recta trayectoria, int cantPiedras, Punto a[], double tolerancia, double init, double fin, double tolIntervalo ){
	
	
	

	 return 0; 
 }
  
